home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcl / docs.lha / cmu-user / cmu-user.info-4 < prev    next >
Text File  |  1992-08-05  |  50KB  |  1,276 lines

  1. Info file: cmu-user.info,    -*-Text-*-
  2. produced by latexinfo-format-buffer
  3. from file: cmu-user.tex
  4.  
  5.  
  6. 
  7. File: cmu-user.info  Node: Precise Type Checking-Footnotes, Up: Precise Type Checking
  8.  
  9. (3) There are a few circumstances where a type declaration is discarded
  10. rather than being used as type assertion.  This doesn't affect safety
  11. much, since such discarded declarations are also not believed to be true
  12. by the compiler.
  13.  
  14. (4) The initial value need not be of this type as long as the
  15. corresponding argument to the constructor is always supplied, but this
  16. will cause a compile-time type warning unless `required-argument'
  17. is used.
  18.  
  19. 
  20. File: cmu-user.info  Node: Weakened Type Checking, Prev: Precise Type Checking, Up: Types in Python
  21.  
  22. Weakened Type Checking
  23. ----------------------
  24.  
  25.  
  26. When the value for the `speed' optimization quality is greater than
  27. `safety', and `safety' is not `0', then type checking is weakened to
  28. reduce the speed and space penalty.  In structure-intensive code this
  29. can double the speed, yet still catch most type errors.  Weakened type
  30. checks provide a level of safety similar to that of "safe" code in other
  31. Common Lisp compilers.
  32.  
  33. A type check is weakened by changing the check to be for some
  34. convenient supertype of the asserted type.  For example,
  35. `(integer 3 17)' is changed to `fixnum',
  36. `(simple-vector 17)' to `simple-vector', and structure
  37. types are changed to `structure'.  A complex check like:
  38.      
  39.      (or node hunk (member :foo :bar :baz))
  40.  
  41. will be omitted entirely (i.e., the check is weakened to `*'.)  If a
  42. precise check can be done for no extra cost, then no weakening is done.
  43.  
  44. Although weakened type checking is similar to type checking done by
  45. other compilers, it is sometimes safer and sometimes less safe.
  46. Weakened checks are done in the same places is precise checks, so all
  47. the preceding discussion about where checking is done still applies.
  48. Weakened checking is sometimes somewhat unsafe because although the
  49. check is weakened, the precise type is still input into type inference.
  50. In some contexts this will result in type inferences not justified by
  51. the weakened check, and hence deletion of some type checks that would be
  52. done by conventional compilers.
  53.  
  54. For example, if this code was compiled with weakened checks:
  55.      
  56.      (defstruct foo
  57.        (a nil :type simple-string))
  58.      
  59.      (defstruct bar
  60.        (a nil :type single-float))
  61.      
  62.      (defun myfun (x)
  63.        (declare (type bar x))
  64.        (* (bar-a x) 3.0))
  65.  
  66. and `myfun' was passed a `foo', then no type error would be signalled,
  67. and we would try to multiply a `simple-vector' as though it were a float
  68. (with unpredictable results.)  This is because the check for `bar' was
  69. weakened to `structure', yet when compiling the call to `bar-a', the
  70. compiler thinks it knows it has a `bar'.
  71.  
  72. Note that normally even weakened type checks report the precise type in error
  73. messages.  For example, if `myfun''s `bar' check is weakened to
  74. `structure', and the argument is false, then the error will be:
  75.      
  76.      Type-error in MYFUN:
  77.        NIL is not of type BAR
  78.  
  79. However, there is some speed and space cost for signalling a precise error, so
  80. the weakened type is reported if the `speed' optimization quality is `3' or
  81. `debug' quality is less than `1':
  82.      
  83.      Type-error in MYFUN:
  84.        NIL is not of type STRUCTURE
  85.  
  86. ? for further discussion of the `optimize' declaration.
  87.  
  88.  
  89. 
  90. File: cmu-user.info  Node: Getting Existing Programs to Run, Prev: Types in Python, Up: The Compiler, Next: Compiler Policy
  91.  
  92. Getting Existing Programs to Run
  93. ================================
  94.  
  95.  
  96. Since Python does much more comprehensive type checking than other Lisp
  97. compilers, Python will detect type errors in many programs that have been
  98. debugged using other compilers.  These errors are mostly incorrect
  99. declarations, although compile-time type errors can find actual bugs if parts
  100. of the program have never been tested.  
  101.  
  102. Some incorrect declarations can only be detected by run-time type
  103. checking.  It is very important to initially compile programs with full
  104. type checks and then test this version.  After the checking version has
  105. been tested, then you can consider weakening or eliminating type checks.
  106. This applies even to previously debugged programs.  Python does much
  107. more type inference than other Common Lisp compilers, so believing an
  108. incorrect declaration does much more damage.
  109.  
  110. The most common problem is with variables whose initial value doesn't match the
  111. type declaration.  Incorrect initial values will always be flagged by a
  112. compile-time type error, and they are simple to fix once located.  Consider
  113. this code fragment:
  114.      
  115.      (prog (foo)
  116.        (declare (fixnum foo))
  117.        (setq foo ...)
  118.        ...)
  119.  
  120. Here the variable `foo' is given an initial value of false, but is declared
  121. to be a `fixnum'.  Even if it is never read, the initial value of a variable
  122. must match the declared type.  There are two ways to fix this problem.  Change
  123. the declaration:
  124.      
  125.      (prog (foo)
  126.        (declare (type (or fixnum null) foo))
  127.        (setq foo ...)
  128.        ...)
  129.  
  130. or change the initial value:
  131.      
  132.      (prog ((foo 0))
  133.        (declare (fixnum foo))
  134.        (setq foo ...)
  135.        ...)
  136.  
  137. It is generally preferable to change to a legal initial value rather
  138. than to weaken the declaration, but sometimes it is simpler to weaken
  139. the declaration than to try to make an initial value of the appropriate
  140. type.
  141.  
  142.  
  143. Another declaration problem occasionally encountered is incorrect declarations
  144. on `defmacro' arguments.  This probably usually happens when a function is
  145. converted into a macro.   Consider this macro:
  146.      
  147.      (defmacro my-1+ (x)
  148.        (declare (fixnum x))
  149.        `(the fixnum (1+ ,x)))
  150.  
  151. Although legal and well-defined CMU Common Lisp, this meaning of this definition is
  152. almost certainly not what the writer intended.  For example, this call is
  153. illegal:
  154.      
  155.      (my-1+ (+ 4 5))
  156.  
  157. The call is illegal because the argument to the macro is `(+ 4 5)', which
  158. is a `list', not a `fixnum'.  Because of macro semantics, it is hardly ever
  159. useful to declare the types of macro arguments.  If you really want to assert
  160. something about the type of the result of evaluating a macro argument, then put
  161. a `the' in the expansion:
  162.      
  163.      (defmacro my-1+ (x)
  164.        `(the fixnum (1+ (the fixnum ,x))))
  165.  
  166. In this case, it would be stylistically preferable to change this macro
  167. back to a function and declare it inline.  Macros have no efficiency
  168. advantage over inline functions when using Python.  ?.
  169.  
  170.  
  171. Some more subtle problems are caused by incorrect declarations that can't be
  172. detected at compile time.  Consider this code:
  173.      
  174.      (do ((pos 0 (position #\a string :start (1+ pos))))
  175.          ((null pos))
  176.        (declare (fixnum pos))
  177.        ...)
  178.  
  179. Although `pos' is almost always a `fixnum', it is false at the end of
  180. the loop.  If this example is compiled with full type checks (the
  181. default), then running it will signal a type error at the end of the
  182. loop.  If compiled without type checks, the program will go into an
  183. infinite loop (or perhaps `position' will complain because `(1+ nil)'
  184. isn't a sensible start.)  Why?  Because if you compile without type
  185. checks, the compiler just quietly believes the type declaration.  Since
  186. `pos' is always a `fixnum', it is never nil, so `(null pos)' is never
  187. true, and the loop exit test is optimized away.  Such errors are
  188. sometimes flagged by unreachable code notes (?), but it is still
  189. important to initially compile any system with full type checks, even if
  190. the system works fine when compiled using other compilers.
  191.  
  192. In this case, the fix is to weaken the type declaration to `(or fixnum
  193. null)'. (5) (*Note Getting Existing Programs to Run-Footnotes::) Note
  194. that there is usually little performance penalty for weakening a
  195. declaration in this way.  Any numeric operations in the body can still
  196. assume the variable is a `fixnum', since
  197. false is not a legal numeric argument.  Another possible fix would be to say:
  198.      
  199.      (do ((pos 0 (position #\a string :start (1+ pos))))
  200.          ((null pos))
  201.        (let ((pos pos))
  202.          (declare (fixnum pos))
  203.          ...))
  204.  
  205. This would be preferable in some circumstances, since it would allow a
  206. non-standard representation to be used for the local `pos' variable in the
  207. loop body (see section ?.)
  208.  
  209. In summary, remember that ALL values that a variable EVER has must be of
  210. the declared type, and that you should test using safe code initially.
  211.  
  212.  
  213. 
  214. File: cmu-user.info  Node: Getting Existing Programs to Run-Footnotes, Up: Getting Existing Programs to Run
  215.  
  216. (5) Actually, this declaration is totally unnecessary in Python, since
  217. it already knows `position' returns a non-negative `fixnum' or
  218. false.
  219.  
  220. 
  221. File: cmu-user.info  Node: Compiler Policy, Prev: Getting Existing Programs to Run, Up: The Compiler, Next: Open Coding and Inline Expansion
  222.  
  223. Compiler Policy
  224. ===============
  225.  
  226.  
  227. The policy is what tells the compiler HOW to compile a program.  This is
  228. logically (and often textually) distinct from the program itself.  Broad
  229. control of policy is provided by the `optimize' declaration; other
  230. declarations and variables control more specific aspects of compilation.
  231.  
  232.  
  233. * Menu:
  234.  
  235. * The Optimize Declaration::    
  236. * The Optimize-Interface Declaration::  
  237.  
  238.  
  239. 
  240. File: cmu-user.info  Node: The Optimize Declaration, Prev: Compiler Policy, Up: Compiler Policy, Next: The Optimize-Interface Declaration
  241.  
  242. The Optimize Declaration
  243. ------------------------
  244.  
  245.  
  246. The `optimize' declaration recognizes six different QUALITIES.  The
  247. qualities are conceptually independent aspects of program performance.
  248. In reality, increasing one quality tends to have adverse effects on
  249. other qualities.  The compiler compares the relative values of qualities
  250. when it needs to make a trade-off; i.e., if `speed' is greater than
  251. `safety', then improve speed at the cost of safety.
  252.  
  253. The default for all qualities (except `debug') is `1'.  Whenever
  254. qualities are equal, ties are broken according to a broad idea of what a
  255. good default environment is supposed to be.  Generally this downplays
  256. `speed', `compile-speed' and `space' in favor of `safety' and `debug'.
  257. Novice and casual users should stick to the default policy.  Advanced
  258. users often want to improve speed and memory usage at the cost of safety
  259. and debuggability.
  260.  
  261. If the value for a quality is `0' or `3', then it may have a special
  262. interpretation.  A value of `0' means "totally unimportant", and a `3'
  263. means "ultimately important."  These extreme optimization values enable
  264. "heroic" compilation strategies that are not always desirable and
  265. sometimes self-defeating.  Specifying more than one quality as `3' is
  266. not desirable, since it doesn't tell the compiler which quality is most
  267. important.
  268.  
  269.  
  270. These are the optimization qualities:
  271.      
  272. `speed'     
  273.      
  274.      How fast the program should is run.  `speed 3' enables some
  275.      optimizations that hurt debuggability.
  276.      
  277. `compilation-speed'     
  278.      
  279.      How fast the compiler should run.  Note that increasing this above
  280.      `safety' weakens type checking.
  281.      
  282. `space'     
  283.      
  284.      How much space the compiled code should take up.  Inline expansion
  285.      is mostly inhibited when `space' is greater than `speed'.  A value
  286.      of `0' enables promiscuous inline expansion.  Wide use of a `0'
  287.      value is not recommended, as it may waste so much space that run
  288.      time is slowed.  ? for a discussion of inline expansion.
  289.      
  290. `debug'     
  291.      
  292.      How debuggable the program should be.  The quality is treated
  293.      differently from the other qualities: each value indicates a
  294.      particular level of debugger information; it is not compared with
  295.      the other qualities.  *Note Compiler Policy Control:: for more
  296.      details.
  297.      
  298. `safety'     
  299.      
  300.      How much error checking should be done.  If `speed', `space' or
  301.      `compilation-speed' is more important than `safety', then type
  302.      checking is weakened (*Note Weakened Type Checking::).  If `safety'
  303.      if `0', then no run time error checking is done.  In addition to
  304.      suppressing type checks, `0' also suppresses argument count
  305.      checking, unbound-symbol checking and array bounds checks.
  306.      
  307. `extensions:inhibit-warnings'     
  308.      
  309.      This is a CMU extension that determines how little (or how much)
  310.      diagnostic output should be printed during compilation.  This
  311.      quality is compared to other qualities to determine whether to
  312.      print style notes and warnings concerning those qualities.  If
  313.      `speed' is greater than `inhibit-warnings', then notes about how to
  314.      improve speed will be printed, etc.  The default value is `1', so
  315.      raising the value for any standard quality above its default
  316.      enables notes for that quality.  If `inhibit-warnings' is `3', then
  317.      all notes and most non-serious warnings are inhibited.  This is
  318.      useful with `declare' to suppress warnings about unavoidable
  319.      problems.
  320.  
  321.  
  322. 
  323. File: cmu-user.info  Node: The Optimize-Interface Declaration, Prev: The Optimize Declaration, Up: Compiler Policy
  324.  
  325. The Optimize-Interface Declaration
  326. ----------------------------------
  327.  
  328.  
  329. The `extensions:optimize-interface' declaration is identical in syntax
  330. to the `optimize' declaration, but it specifies the policy used during
  331. compilation of code the compiler automatically generates to check the
  332. number and type of arguments supplied to a function.  It is useful to
  333. specify this policy separately, since even thoroughly debugged functions
  334. are vulnerable to being passed the wrong arguments.  The
  335. `optimize-interface' declaration can specify that arguments should be
  336. checked even when the general `optimize' policy is unsafe.
  337.  
  338. Note that this argument checking is the checking of user-supplied
  339. arguments to any functions defined within the scope of the declaration,
  340. `not' the checking of arguments to Common Lisp primitives that appear in
  341. those definitions.
  342.  
  343. The idea behind this declaration is that it allows the definition of
  344. functions that appear fully safe to other callers, but that do no
  345. internal error checking.  Of course, it is possible that arguments may
  346. be invalid in ways other than having incorrect type.  Functions compiled
  347. unsafely must still protect themselves against things like user-supplied
  348. array indices that are out of bounds and improper lists.  See also the
  349. :context-declarations option to with-compilation-unit *Note Compilation
  350. Units::.
  351.  
  352.  
  353. 
  354. File: cmu-user.info  Node: Open Coding and Inline Expansion, Prev: Compiler Policy, Up: The Compiler
  355.  
  356. Open Coding and Inline Expansion
  357. ================================
  358.  
  359.  
  360. Since CMU Common Lisp forbids the redefinition of standard functions (6)
  361. (*Note Open Coding and Inline Expansion-Footnotes::), the compiler can
  362. have special knowledge of these standard functions embedded in it.  This
  363. special knowledge is used in various ways (open coding, inline
  364. expansion, source transformation), but the implications to the user are
  365. basically the same:
  366.      
  367.    * Attempts to redefine standard functions may be frustrated, since
  368.      the function may never be called.  Although it is technically
  369.      illegal to redefine standard functions, users sometimes want to
  370.      implicitly redefine these functions when they are debugging using
  371.      the `trace' macro.  Special-casing of standard functions can be
  372.      inhibited using the `notinline' declaration.
  373.      
  374.    * The compiler can have multiple alternate implementations of
  375.      standard functions that implement different trade-offs of speed,
  376.      space and safety.  This selection is based on the compiler policy,
  377.      *Note Compiler Policy::.
  378.  
  379.  
  380.  
  381. When a function call is open coded, inline code whose effect is
  382. equivalent to the function call is substituted for that function call.
  383. When a function call is closed coded, it is usually left as is,
  384. although it might be turned into a call to a different function with
  385. different arguments.  As an example, if `nthcdr' were to be open
  386. coded, then
  387.      
  388.      (nthcdr 4 foobar)
  389.  
  390. might turn into
  391.      
  392.      (cdr (cdr (cdr (cdr foobar))))
  393.  
  394. or even 
  395.      
  396.      (do ((i 0 (1+ i))
  397.           (list foobar (cdr foobar)))
  398.          ((= i 4) list))
  399.  
  400.  
  401. If `nth' is closed coded, then
  402.      
  403.      (nth x l)
  404.  
  405. might stay the same, or turn into something like:
  406.      
  407.      (car (nthcdr x l))
  408.  
  409.  
  410. In general, open coding sacrifices space for speed, but some functions
  411. (such as `car') are so simple that they are always open-coded.  Even
  412. when not open-coded, a call to a standard function may be transformed
  413. into a different function call (as in the last example) or compiled as
  414. static call.  Static function call uses a more efficient calling
  415. convention that forbids redefinition.
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422. 
  423. File: cmu-user.info  Node: Open Coding and Inline Expansion-Footnotes, Up: Open Coding and Inline Expansion
  424.  
  425. (6) See the proposed X3J13 "lisp-symbol-redefinition" cleanup.
  426.  
  427. 
  428. File: cmu-user.info  Node: Advanced Compiler Use and Efficiency Hints, Prev: The Compiler, Up: Top, Next: UNIX Interface
  429.  
  430. Advanced Compiler Use and Efficiency Hints
  431. ******************************************
  432.  
  433.                           By Robert MacLachlan
  434.  
  435.  
  436. * Menu:
  437.  
  438. * Advanced Compiler Introduction::  
  439. * More About Types in Python::  
  440. * Type Inference::              
  441. * Source Optimization::         
  442. * Tail Recursion::              
  443. * Local Call::                  
  444. * Block Compilation::           
  445. * Inline Expansion::            
  446. * Object Representation::       
  447. * Numbers::                     
  448. * General Efficiency Hints::    
  449. * Efficiency Notes::            
  450. * Profiling::                   
  451.  
  452.  
  453. 
  454. File: cmu-user.info  Node: Advanced Compiler Introduction, Prev: Advanced Compiler Use and Efficiency Hints, Up: Advanced Compiler Use and Efficiency Hints, Next: More About Types in Python
  455.  
  456. Advanced Compiler Introduction
  457. ==============================
  458.  
  459.  
  460. In CMU Common Lisp, as is any language on any computer, the path to
  461. efficient code starts with good algorithms and sensible programming
  462. techniques, but to avoid inefficiency pitfalls, you need to know some of
  463. this implementation's quirks and features.  This chapter is mostly a
  464. fairly long and detailed overview of what optimizations Python does.
  465. Although there are the usual negative suggestions of inefficient
  466. features to avoid, the main emphasis is on describing the things that
  467. programmers can count on being efficient.
  468.  
  469. The optimizations described here can have the effect of speeding up
  470. existing programs written in conventional styles, but the potential for
  471. new programming styles that are clearer and less error-prone is at least
  472. as significant.  For this reason, several sections end with a discussion
  473. of the implications of these optimizations for programming style.
  474.  
  475. * Menu:
  476.  
  477. * Types::                       
  478. * Optimization::                
  479. * Function Call::               
  480. * Representation of Objects::   
  481. * Writing Efficient Code::      
  482.  
  483.  
  484. 
  485. File: cmu-user.info  Node: Types, Prev: Advanced Compiler Introduction, Up: Advanced Compiler Introduction, Next: Optimization
  486.  
  487. Types
  488. -----
  489.  
  490.  
  491. Python's support for types is unusual in three major ways:
  492.      
  493.    * Precise type checking encourages the specific use of type declarations as a
  494.      form of run-time consistency checking.  This speeds development by localizing
  495.      type errors and giving more meaningful error messages.  *Note Precise Type Checking::.  Python produces completely safe code; optimized
  496.      type checking maintains reasonable efficiency on conventional hardware (?.)
  497.      
  498.    * Comprehensive support for the CMU Common Lisp type system makes
  499.      complex type specifiers useful.  Using type specifiers such as `or'
  500.      and `member' has both efficiency and robustness advantages.  ?.
  501.      
  502.    * Type inference eliminates the need for some declarations, and also
  503.      aids compile-time detection of type errors.  Given detailed type
  504.      declarations, type inference can often eliminate type checks and
  505.      enable more efficient object representations and code sequences.
  506.      Checking all types results in fewer type checks.  See sections ?
  507.      and ?.
  508.  
  509.  
  510.  
  511. 
  512. File: cmu-user.info  Node: Optimization, Prev: Types, Up: Advanced Compiler Introduction, Next: Function Call
  513.  
  514. Optimization
  515. ------------
  516.  
  517.  
  518. The main barrier to efficient Lisp programs is not that there is no
  519. efficient way to code the program in Lisp, but that it is difficult to
  520. arrive at that efficient coding.  Common Lisp is a highly complex
  521. language, and usually has many semantically equivalent "reasonable" ways
  522. to code a given problem.  It is desirable to make all of these
  523. equivalent solutions have comparable efficiency so that programmers
  524. don't have to waste time discovering the most efficient solution.
  525.  
  526. Source level optimization increases the number of efficient ways to solve a
  527. problem.  This effect is much larger than the increase in the efficiency of the
  528. "best" solution.  Source level optimization transforms the original program
  529. into a more efficient (but equivalent) program.  Although the optimizer isn't
  530. doing anything the programmer couldn't have done, this high-level optimization
  531. is important because:
  532.      
  533.    * The programmer can code simply and directly, rather than
  534.      obfuscating code to please the compiler.
  535.      
  536.    * When presented with a choice of similar coding alternatives, the
  537.      programmer can chose whichever happens to be most convenient,
  538.      instead of worrying about which is most efficient.
  539.  
  540.  
  541. Source level optimization eliminates the need for macros to optimize
  542. their expansion, and also increases the effectiveness of inline
  543. expansion.  See sections ? and ?.
  544.  
  545. Efficient support for a safer programming style is the biggest advantage of
  546. source level optimization.  Existing tuned programs typically won't benefit
  547. much from source optimization, since their source has already been optimized by
  548. hand.  However, even tuned programs tend to run faster under Python because:
  549.      
  550.    * Low level optimization and register allocation provides modest
  551.      speedups in any program.
  552.      
  553.    * Block compilation and inline expansion can reduce function call
  554.      overhead, but may require some program restructuring.  See sections
  555.      ?, ? and ?.
  556.      
  557.    * Efficiency notes will point out important type declarations that
  558.      are often missed even in highly tuned programs.  ?.
  559.      
  560.    * Existing programs can be compiled safely without prohibitive speed
  561.      penalty, although they would be faster and safer with added
  562.      declarations.  ?.
  563.  
  564.  
  565.  
  566. 
  567. File: cmu-user.info  Node: Function Call, Prev: Optimization, Up: Advanced Compiler Introduction, Next: Representation of Objects
  568.  
  569. Function Call
  570. -------------
  571.  
  572.  
  573. The sort of symbolic programs generally written in Common Lisp often favor recursion
  574. over iteration, or have inner loops so complex that they involve multiple
  575. function calls.  Such programs spend a larger fraction of their time doing
  576. function calls than is the norm in other languages; for this reason Common Lisp
  577. implementations strive to make the general (or full) function call as
  578. inexpensive as possible.  Python goes beyond this by providing two good
  579. alternatives to full call:
  580.      
  581.    * Local call resolves function references at compile time, allowing
  582.      better calling sequences and optimization across function calls.
  583.      ?.
  584.      
  585.    * Inline expansion totally eliminates call overhead and allows many
  586.      context dependent optimizations.  This provides a safe and
  587.      efficient implementation of operations with function semantics,
  588.      eliminating the need for error-prone macro definitions or manual
  589.      case analysis.  Although most CMU Common Lisp implementations
  590.      support inline expansion, it becomes a more powerful tool with
  591.      Python's source level optimization.  See sections ? and ?.
  592.  
  593.  
  594.  
  595. Generally, Python provides simple implementations for simple uses of function
  596. call, rather than having only a single calling convention.  These features
  597. allow a more natural programming style:
  598.      
  599.    * Proper tail recursion.  ?
  600.      
  601.    * Relatively efficient closures.
  602.      
  603.    * A `funcall' that is as efficient as normal named call.
  604.      
  605.    * Calls to local functions such as from `labels' are optimized:
  606.           
  607.         * Control transfer is a direct jump.
  608.           
  609.         * The closure environment is passed in registers rather than
  610.           heap allocated.
  611.           
  612.         * Keyword arguments and multiple values are implemented more
  613.           efficiently.
  614.      
  615.      
  616.      ?.
  617.  
  618.  
  619. 
  620. File: cmu-user.info  Node: Representation of Objects, Prev: Function Call, Up: Advanced Compiler Introduction, Next: Writing Efficient Code
  621.  
  622. Representation of Objects
  623. -------------------------
  624.  
  625.  
  626. Sometimes traditional Common Lisp implementation techniques compare so
  627. poorly to the techniques used in other languages that Common Lisp can
  628. become an impractical language choice.  Terrible inefficiencies appear
  629. in number-crunching programs, since Common Lisp numeric operations often
  630. involve number-consing and generic arithmetic.  Python supports
  631. efficient natural representations for numbers (and some other types),
  632. and allows these efficient representations to be used in more contexts.
  633. Python also provides good efficiency notes that warn when a crucial
  634. declaration is missing.
  635.  
  636. See section ? for more about object representations and numeric types.
  637. Also ? about efficiency notes.
  638.  
  639. 
  640. File: cmu-user.info  Node: Writing Efficient Code, Prev: Representation of Objects, Up: Advanced Compiler Introduction
  641.  
  642. Writing Efficient Code
  643. ----------------------
  644.  
  645.  
  646. Writing efficient code that works is a complex and prolonged process.  It is
  647. important not to get so involved in the pursuit of efficiency that you lose
  648. sight of what the original problem demands.  Remember that:
  649.      
  650.    * The program should be correct -- it doesn't matter how quickly you
  651.      get the wrong answer.
  652.      
  653.    * Both the programmer and the user will make errors, so the program
  654.      must be robust -- it must detect errors in a way that allows easy
  655.      correction.
  656.      
  657.    * A small portion of the program will consume most of the resources,
  658.      with the bulk of the code being virtually irrelevant to efficiency
  659.      considerations.  Even experienced programmers familiar with the
  660.      problem area cannot reliably predict where these "hot spots" will
  661.      be.
  662.  
  663.  
  664.  
  665.  
  666. The best way to get efficient code that is still worth using, is to separate
  667. coding from tuning.  During coding, you should:
  668.      
  669.    * Use a coding style that aids correctness and robustness without
  670.      being incompatible with efficiency.
  671.      
  672.    * Choose appropriate data structures that allow efficient algorithms
  673.      and object representations (?).  Try to make interfaces abstract
  674.      enough so that you can change to a different representation if
  675.      profiling reveals a need.
  676.      
  677.    * Whenever you make an assumption about a function argument or global
  678.      data structure, add consistency assertions, either with type
  679.      declarations or explicit uses of `assert', `ecase', etc.
  680.  
  681.  
  682. During tuning, you should:
  683.      
  684.    * Identify the hot spots in the program through profiling (section
  685.      ?.)
  686.      
  687.    * Identify inefficient constructs in the hot spot with efficiency
  688.      notes, more profiling, or manual inspection of the source.  See
  689.      sections ? and ?.
  690.      
  691.    * Add declarations and consider the application of optimizations.
  692.      See sections ?, ? and ?.
  693.      
  694.    * If all else fails, consider algorithm or data structure changes.
  695.      If you did a good job coding, changes will be easy to introduce.
  696.  
  697.  
  698.  
  699.  
  700.  
  701. 
  702. File: cmu-user.info  Node: More About Types in Python, Prev: Advanced Compiler Introduction, Up: Advanced Compiler Use and Efficiency Hints, Next: Type Inference
  703.  
  704. More About Types in Python
  705. ==========================
  706.  
  707.  
  708. This section goes into more detail describing what types and declarations are
  709. recognized by Python.  The area where Python differs most radically from
  710. previous Common Lisp compilers is in its support for types:
  711.      
  712.    * Precise type checking helps to find bugs at run time.
  713.      
  714.    * Compile-time type checking helps to find bugs at compile time.
  715.      
  716.    * Type inference minimizes the need for generic operations, and also
  717.      increases the efficiency of run time type checking and the
  718.      effectiveness of compile time type checking.
  719.      
  720.    * Support for detailed types provides a wealth of opportunity for
  721.      operation-specific type inference and optimization.
  722.  
  723.  
  724.  
  725.  
  726. * Menu:
  727.  
  728. * More Types Meaningful::       
  729. * Canonicalization::            
  730. * Member Types::                
  731. * Union Types::                 
  732. * The Empty Type::              
  733. * Function Types::              
  734. * The Values Declaration::      
  735. * Structure Types::             
  736. * The Freeze-Type Declaration::  
  737. * Type Restrictions::           
  738. * Type Style Recommendations::  
  739.  
  740.  
  741. 
  742. File: cmu-user.info  Node: More Types Meaningful, Prev: More About Types in Python, Up: More About Types in Python, Next: Canonicalization
  743.  
  744. More Types Meaningful
  745. ---------------------
  746.  
  747.  
  748. CMU Common Lisp has a very powerful type system, but conventional Common
  749. Lisp implementations typically only recognize the small set of types
  750. special in that implementation.  In these systems, there is an
  751. unfortunate paradox: a declaration for a relatively general type like
  752. `fixnum' will be recognized by the compiler, but a highly specific
  753. declaration such as `(integer 3 17)' is totally ignored.
  754.  
  755. This is obviously a problem, since the user has to know how to specify
  756. the type of an object in the way the compiler wants it.  A very minimal
  757. (but rarely satisfied) criterion for type system support is that it be
  758. no worse to make a specific declaration than to make a general one.
  759. Python goes beyond this by exploiting a number of advantages obtained
  760. from detailed type information.
  761.  
  762. Using more restrictive types in declarations allows the compiler to do
  763. better type inference and more compile-time type checking.  Also, when
  764. type declarations are considered to be consistency assertions that
  765. should be verified (conditional on policy), then complex types are
  766. useful for making more detailed assertions.
  767.  
  768. Python "understands" the list-style `or', `member', `function', array and
  769. number type specifiers.  Understanding means that:
  770.      
  771.    * If the type contains more information than is used in a particular
  772.      context, then the extra information is simply ignored, rather than
  773.      derailing type inference.
  774.      
  775.    * In many contexts, the extra information from these type specifier
  776.      is used to good effect.  In particular, type checking in `Python'
  777.      is PRECISE, so these complex types can be used in declarations to
  778.      make interesting assertions about functions and data structures
  779.      (*Note Precise Type Checking::.)  More specific declarations also
  780.      aid type inference and reduce the cost for type checking.
  781.  
  782.  
  783. For related information, ? for numeric types, and section ? for array
  784. types.
  785.  
  786.  
  787. 
  788. File: cmu-user.info  Node: Canonicalization, Prev: More Types Meaningful, Up: More About Types in Python, Next: Member Types
  789.  
  790. Canonicalization
  791. ----------------
  792.  
  793.  
  794. When given a type specifier, Python will often rewrite it into a different
  795. (but equivalent) type.  This is the mechanism that Python uses for detecting
  796. type equivalence.  For example, in Python's canonical representation, these
  797. types are equivalent:
  798.      
  799.      (or list (member :end)) == (or cons (member nil :end))
  800.  
  801. This has two implications for the user:
  802.      
  803.    * The standard symbol type specifiers for `atom', `null', `fixnum',
  804.      etc., are in no way magical.  The null type is actually defined to
  805.      be `(member nil)', list is `(or cons null)', and fixnum is
  806.      `(signed-byte 30)'.
  807.      
  808.    * When the compiler prints out a type, it may not look like the type
  809.      specifier that originally appeared in the program.  This is
  810.      generally not a problem, but it must be taken into consideration
  811.      when reading compiler error messages.
  812.  
  813.  
  814.  
  815. 
  816. File: cmu-user.info  Node: Member Types, Prev: Canonicalization, Up: More About Types in Python, Next: Union Types
  817.  
  818. Member Types
  819. ------------
  820.  
  821.  
  822. The member type specifier can be used to represent
  823. "symbolic" values, analogous to the enumerated types of Pascal.  For
  824. example, the second value of `find-symbol' has this type:
  825.      
  826.      (member :internal :external :inherited nil)
  827.  
  828. Member types are very useful for expressing consistency constraints on data
  829. structures, for example:
  830.      
  831.      (defstruct ice-cream
  832.        (flavor :vanilla :type (member :vanilla :chocolate :strawberry)))
  833.  
  834. Member types are also useful in type inference, as the number of members
  835. can sometimes be pared down to one, in which case the value is a known
  836. constant.
  837.  
  838. 
  839. File: cmu-user.info  Node: Union Types, Prev: Member Types, Up: More About Types in Python, Next: The Empty Type
  840.  
  841. Union Types
  842. -----------
  843.  
  844.  
  845. The or (union) type specifier is understood, and is
  846. meaningfully applied in many contexts.  The use of `or' allows
  847. assertions to be made about types in dynamically typed programs.  For
  848. example:
  849.      
  850.      (defstruct box
  851.        (next nil :type (or box null))
  852.        (top :removed :type (or box-top (member :removed))))
  853.  
  854. The type assertion on the `top' slot ensures that an error will be signalled
  855. when there is an attempt to store an illegal value (such as `:rmoved'.)
  856. Although somewhat weak, these union type assertions provide a useful input into
  857. type inference, allowing the cost of type checking to be reduced.  For example,
  858. this loop is safely compiled with no type checks:
  859.      
  860.      (defun find-box-with-top (box)
  861.        (declare (type (or box null) box))
  862.        (do ((current box (box-next current)))
  863.            ((null current))
  864.          (unless (eq (box-top current) :removed)
  865.            (return current))))
  866.  
  867.  
  868. Union types are also useful in type inference for representing types that are
  869. partially constrained.  For example, the result of this expression:
  870.      
  871.      (if foo
  872.          (logior x y)
  873.          (list x y))
  874.  
  875. can be expressed as `(or integer cons)'.
  876.  
  877. 
  878. File: cmu-user.info  Node: The Empty Type, Prev: Union Types, Up: More About Types in Python, Next: Function Types
  879.  
  880. The Empty Type
  881. --------------
  882.  
  883.  
  884. The type false is also called the empty type, since no object is of type
  885. false.  The union of no types, `(or)', is also empty.  Python's
  886. interpretation of an expression whose type is false is that the
  887. expression never yields any value, but rather fails to terminate, or is
  888. thrown out of.  For example, the type of a call to `error' or a use of
  889. `return' is false.  When the type of an expression is empty,
  890. compile-time type warnings about its value are suppressed; presumably
  891. somebody else is signalling an error.  If a function is declared to have
  892. return type false, but does in fact return, then (in safe compilation
  893. policies) a `"NIL Function returned"' error will be signalled.  See also
  894. the function required-argument *Note Compile Time Type Errors::.
  895.  
  896. 
  897. File: cmu-user.info  Node: Function Types, Prev: The Empty Type, Up: More About Types in Python, Next: The Values Declaration
  898.  
  899. Function Types
  900. --------------
  901.  
  902.  
  903. function types are understood in the restrictive sense, specifying:
  904.      
  905.    * The argument syntax that the function must be called with.  This is
  906.      information about what argument counts are acceptable, and which
  907.      keyword arguments are recognized.  In Python, warnings about
  908.      argument syntax are a consequence of function type checking.
  909.      
  910.    * The types of the argument values that the caller must pass.  If the
  911.      compiler can prove that some argument to a call is of a type
  912.      disallowed by the called function's type, then it will give a
  913.      compile-time type warning.  In addition to being used for
  914.      compile-time type checking, these type assertions are also used as
  915.      output type assertions in code generation.  For example, if `foo'
  916.      is declared to have a `fixnum' argument, then the `1+' in `(foo (1+
  917.      x))' is compiled with knowledge that the result must be a fixnum.
  918.      
  919.    * The types the values that will be bound to argument variables in
  920.      the function's definition.  Declaring a function's type with
  921.      `ftype' implicitly declares the types of the arguments in the
  922.      definition.  Python checks for consistency between the definition
  923.      and the `ftype' declaration.  Because of precise type checking, an
  924.      error will be signalled when a function is called with an argument
  925.      of the wrong type.
  926.      
  927.    * The type of return value(s) that the caller can expect.  This
  928.      information is a useful input to type inference.  For example, if a
  929.      function is declared to return a `fixnum', then when a call to that
  930.      function appears in an expression, the expression will be compiled
  931.      with knowledge that the call will return a `fixnum'.
  932.      
  933.    * The type of return value(s) that the definition must return.  The
  934.      result type in an `ftype' declaration is treated like an implicit
  935.      `the' wrapped around the body of the definition.  If the definition
  936.      returns a value of the wrong type, an error will be signalled.  If
  937.      the compiler can prove that the function returns the wrong type,
  938.      then it will give a compile-time warning.
  939.  
  940.  
  941. This is consistent with the new interpretation of function types and the
  942. `ftype' declaration in the proposed X3J13
  943. "function-type-argument-type-semantics" cleanup.  Note also, that if you
  944. don't explicitly declare the type of a function using a global `ftype'
  945. declaration, then Python will compute a function type from the
  946. definition, providing a degree of inter-routine type inference, ?.
  947.  
  948. 
  949. File: cmu-user.info  Node: The Values Declaration, Prev: Function Types, Up: More About Types in Python, Next: Structure Types
  950.  
  951. The Values Declaration
  952. ----------------------
  953.  
  954.  
  955. CMU Common Lisp supports the `values' declaration as an extension to CMU Common Lisp.  The
  956. syntax is `(values type1 type2 ... TYPEN)'.
  957. This declaration is semantically equivalent to a `the' form
  958. wrapped around the body of the special form in which the
  959. `values' declaration appears.  The advantage of `values'
  960. over the is purely syntactic -- it doesn't introduce
  961. more indentation.  For example:
  962.      
  963.      (defun foo (x)
  964.        (declare (values single-float))
  965.        (ecase x
  966.          (:this ...)
  967.          (:that ...)
  968.          (:the-other ...)))
  969.  
  970. is equivalent to:
  971.      
  972.      (defun foo (x)
  973.        (the single-float
  974.             (ecase x
  975.               (:this ...)
  976.               (:that ...)
  977.               (:the-other ...))))
  978.  
  979. and
  980.      
  981.      (defun floor (number &optional (divisor 1))
  982.        (declare (values integer real))
  983.        ...)
  984.  
  985. is equivalent to:
  986.      
  987.      (defun floor (number &optional (divisor 1))
  988.        (the (values integer real)
  989.             ...))
  990.  
  991. In addition to being recognized by `lambda' (and hence by `defun'), the
  992. `values' declaration is recognized by all the other special forms with
  993. bodies and declarations: `let', `let*', `labels' and `flet'.  Macros
  994. with declarations usually splice the declarations into one of the above
  995. forms, so they will accept this declaration too, but the exact effect of
  996. a `values' declaration will depend on the macro.
  997.  
  998. If you declare the types of all arguments to a function, and also
  999. declare the return value types with `values', you have described the
  1000. type of the function.  Python will use this argument and result type
  1001. information to derive a function type that will then be applied to calls
  1002. of the function (*Note Function Types::.)  This provides a way to
  1003. declare the types of functions that is much less syntactically awkward
  1004. than using the `ftype' declaration with a `function' type specifier.
  1005.  
  1006. Although the `values' declaration is non-standard, it is relatively
  1007. harmless to use it in otherwise portable code, since any warning in
  1008. non-CMU implementations can be suppressed with the standard
  1009. `declaration' proclamation.
  1010.  
  1011. 
  1012. File: cmu-user.info  Node: Structure Types, Prev: The Values Declaration, Up: More About Types in Python, Next: The Freeze-Type Declaration
  1013.  
  1014. Structure Types
  1015. ---------------
  1016.  
  1017.  
  1018. Because of precise type checking, structure types are much better supported by
  1019. Python than by conventional compilers:
  1020.      
  1021.    * The structure argument to structure accessors is precisely checked
  1022.      -- if you call `foo-a' on a `bar', an error will be signalled.
  1023.      
  1024.    * The types of slot values are precisely checked -- if you pass the
  1025.      wrong type argument to a constructor or a slot setter, then an
  1026.      error will be signalled.
  1027.  
  1028. This error checking is tremendously useful for detecting bugs in
  1029. programs that manipulate complex data structures.
  1030.  
  1031. An additional advantage of checking structure types and enforcing slot types
  1032. is that the compiler can safely believe slot type declarations.  Python
  1033. effectively moves the type checking from the slot access to the slot setter or
  1034. constructor call.  This is more efficient since caller of the setter or
  1035. constructor often knows the type of the value, entirely eliminating the need to
  1036. check the value's type.  Consider this example:
  1037.      
  1038.      (defstruct coordinate
  1039.        (x nil :type single-float)
  1040.        (y nil :type single-float))
  1041.      
  1042.      (defun make-it ()
  1043.        (make-coordinate :x 1.0 :y 1.0))
  1044.      
  1045.      (defun use-it (it)
  1046.        (declare (type coordinate it))
  1047.        (sqrt (expt (coordinate-x it) 2) (expt (coordinate-y it) 2)))
  1048.  
  1049. `make-it' and `use-it' are compiled with no checking on the types of the
  1050. float slots, yet `use-it' can use `single-float' arithmetic with perfect
  1051. safety.  Note that `make-coordinate' must still check the values of `x'
  1052. and `y' unless the call is block compiled or inline expanded (?.)  But
  1053. even without this advantage, it is almost always more efficient to check
  1054. slot values on structure initialization, since slots are usually written
  1055. once and read many times.
  1056.  
  1057. 
  1058. File: cmu-user.info  Node: The Freeze-Type Declaration, Prev: Structure Types, Up: More About Types in Python, Next: Type Restrictions
  1059.  
  1060. The Freeze-Type Declaration
  1061. ---------------------------
  1062.  
  1063.  
  1064. The `extensions:freeze-type' declaration is a CMU extension that enables more
  1065. efficient compilation of user-defined types by asserting that the definition is
  1066. not going to change.  This declaration may only be used globally (with
  1067. `declaim' or `proclaim').  Currently `freeze-type' only affects structure
  1068. type testing done by `typep', `typecase', etc.  Here is an example:
  1069.      
  1070.      (declaim (freeze-type foo bar))
  1071.  
  1072. This asserts that the types `foo' and `bar' and their subtypes are not
  1073. going to change.  This allows more efficient type testing, since the
  1074. compiler can open-code a test for all possible subtypes, rather than
  1075. having to examine the type hierarchy at run-time.
  1076.  
  1077. 
  1078. File: cmu-user.info  Node: Type Restrictions, Prev: The Freeze-Type Declaration, Up: More About Types in Python, Next: Type Style Recommendations
  1079.  
  1080. Type Restrictions
  1081. -----------------
  1082.  
  1083.  
  1084. Avoid use of the `and', `not' and `satisfies' types in declarations,
  1085. since type inference has problems with them.  When these types do appear in a
  1086. declaration, they are still checked precisely, but the type information is of
  1087. limited use to the compiler.  `and' types are effective as long as the
  1088. intersection can be canonicalized to a type that doesn't use `and'.  For
  1089. example:
  1090.      
  1091.      (and fixnum unsigned-byte)
  1092.  
  1093. is fine, since it is the same as:
  1094.      
  1095.      (integer 0 MOST-POSITIVE-FIXNUM)
  1096.  
  1097. but this type:
  1098.      
  1099.      (and symbol (not (member :end)))
  1100.  
  1101. will not be fully understood by type interference since the `and' can't
  1102. be removed by canonicalization.
  1103.  
  1104. Using any of these type specifiers in a type test with `typep' or
  1105. `typecase' is fine, since as tests, these types can be translated into
  1106. the `and' macro, the `not' function or a call to the satisfies
  1107. predicate.
  1108.  
  1109. 
  1110. File: cmu-user.info  Node: Type Style Recommendations, Prev: Type Restrictions, Up: More About Types in Python
  1111.  
  1112. Type Style Recommendations
  1113. --------------------------
  1114.  
  1115.  
  1116. Python provides good support for some currently unconventional ways of using
  1117. the CMU Common Lisp type system.  With Python, it is desirable to make declarations as
  1118. precise as possible, but type inference also makes some declarations
  1119. unnecessary.  Here are some general guidelines for maximum robustness and
  1120. efficiency:
  1121.      
  1122.    * Declare the types of all function arguments and structure slots as
  1123.      precisely as possible (while avoiding `not', `and' and
  1124.      `satisfies').  Put these declarations in during initial coding so
  1125.      that type assertions can find bugs for you during debugging.
  1126.      
  1127.    * Use the member type specifier where there are a small number of
  1128.      possible symbol values, for example: `(member :red :blue :green)'.
  1129.      
  1130.    * Use the or type specifier in situations where the type is not
  1131.      certain, but there are only a few possibilities, for example: `(or
  1132.      list vector)'.
  1133.      
  1134.    * Declare integer types with the tightest bounds that you can, such
  1135.      as `(integer 3 7)'.
  1136.      
  1137.    * Define deftype or defstruct types before they are used.  Definition
  1138.      after use is legal (producing no "undefined type" warnings), but
  1139.      type tests and structure operations will be compiled much less
  1140.      efficiently.
  1141.      
  1142.    * In addition to declaring the array element type and simpleness, also declare
  1143.      the dimensions if they are fixed, for example:
  1144.           
  1145.           (simple-array single-float (1024 1024))
  1146.      
  1147.      This bounds information allows array indexing for multi-dimensional
  1148.      arrays to be compiled much more efficiently, and may also allow
  1149.      array bounds checking to be done at compile time.  ?.
  1150.      
  1151.    * Avoid use of the the declaration within expressions.  Not only does
  1152.      it clutter the code, but it is also almost worthless under safe
  1153.      policies.  If the need for an output type assertion is revealed by
  1154.      efficiency notes during tuning, then you can consider `the', but it
  1155.      is preferable to constrain the argument types more, allowing the
  1156.      compiler to prove the desired result type.
  1157.      
  1158.    * Don't bother declaring the type of let or other non-argument
  1159.      variables unless the type is non-obvious.  If you declare function
  1160.      return types and structure slot types, then the type of a variable
  1161.      is often obvious both to the programmer and to the compiler.  An
  1162.      important case where the type isn't obvious, and a declaration is
  1163.      appropriate, is when the value for a variable is pulled out of
  1164.      untyped structure (e.g., the result of `car'), or comes from some
  1165.      weakly typed function, such as `read'.
  1166.      
  1167.    * Declarations are sometimes necessary for integer loop variables,
  1168.      since the compiler can't always prove that the value is of a good
  1169.      integer type.  These declarations are best added during tuning,
  1170.      when an efficiency note indicates the need.
  1171.  
  1172.  
  1173.  
  1174.  
  1175. 
  1176. File: cmu-user.info  Node: Type Inference, Prev: More About Types in Python, Up: Advanced Compiler Use and Efficiency Hints, Next: Source Optimization
  1177.  
  1178. Type Inference
  1179. ==============
  1180.  
  1181.  
  1182. Type inference is the process by which the compiler tries to figure out
  1183. the types of expressions and variables, given an inevitable lack of
  1184. complete type information.  Although Python does much more type
  1185. inference than most Common Lisp compilers, remember that the more
  1186. precise and comprehensive type declarations are, the more type inference
  1187. will be able to do.
  1188.  
  1189. * Menu:
  1190.  
  1191. * Variable Type Inference::     
  1192. * Local Function Type Inference::  
  1193. * Global Function Type Inference::  
  1194. * Operation Specific Type Inference::  
  1195. * Dynamic Type Inference::      
  1196. * Type Check Optimization::     
  1197.  
  1198.  
  1199. 
  1200. File: cmu-user.info  Node: Variable Type Inference, Prev: Type Inference, Up: Type Inference, Next: Local Function Type Inference
  1201.  
  1202. Variable Type Inference
  1203. -----------------------
  1204.  
  1205.  
  1206. The type of a variable is the union of the types of all the definitions.
  1207. In the degenerate case of a let, the type of the variable is the type of
  1208. the initial value.  This inferred type is intersected with any declared
  1209. type, and is then propagated to all the variable's references.  The
  1210. types of multiple-value-bind variables are similarly inferred from the
  1211. types of the individual values of the values form.
  1212.  
  1213. If multiple type declarations apply to a single variable, then all the
  1214. declarations must be correct; it is as though all the types were intersected
  1215. producing a single and type specifier.  In this example:
  1216.      
  1217.      (defmacro my-dotimes ((var count) &body body)
  1218.        `(do ((,var 0 (1+ ,var)))
  1219.             ((>= ,var ,count))
  1220.           (declare (type (integer 0 *) ,var))
  1221.           ,@body))
  1222.      
  1223.      (my-dotimes (i ...)
  1224.        (declare (fixnum i))
  1225.        ...)
  1226.  
  1227. the two declarations for `i' are intersected, so `i' is known to be a
  1228. non-negative fixnum.
  1229.  
  1230. In practice, this type inference is limited to lets and local functions, since
  1231. the compiler can't analyze all the calls to a global function.  But type
  1232. inference works well enough on local variables so that it is often unnecessary
  1233. to declare the type of local variables.  This is especially likely when
  1234. function result types and structure slot types are declared.  The main areas
  1235. where type inference breaks down are:
  1236.      
  1237.    * When the initial value of a variable is a untyped expression, such as
  1238.      `(car x)', and
  1239.      
  1240.    * When the type of one of the variable's definitions is a function of the
  1241.      variable's current value, as in: `(setq x (1+ x))'
  1242.  
  1243.  
  1244.  
  1245. 
  1246. File: cmu-user.info  Node: Local Function Type Inference, Prev: Variable Type Inference, Up: Type Inference, Next: Global Function Type Inference
  1247.  
  1248. Local Function Type Inference
  1249. -----------------------------
  1250.  
  1251.  
  1252. The types of arguments to local functions are inferred in the same was
  1253. as any other local variable; the type is the union of the argument types
  1254. across all the calls to the function, intersected with the declared
  1255. type.  If there are any assignments to the argument variables, the type
  1256. of the assigned value is unioned in as well.
  1257.  
  1258. The result type of a local function is computed in a special way that takes
  1259. tail recursion (?) into consideration.  The
  1260. result type is the union of all possible return values that aren't
  1261. tail-recursive calls.  For example, Python will infer that the result type of
  1262. this function is `integer':
  1263.      
  1264.      (defun ! (n res)
  1265.        (declare (integer n res))
  1266.        (if (zerop n)
  1267.            res
  1268.            (! (1- n) (* n res))))
  1269.  
  1270. Although this is a rather obvious result, it becomes somewhat less
  1271. trivial in the presence of mutual tail recursion of multiple functions.
  1272. Local function result type inference interacts with the mechanisms for
  1273. ensuring proper tail recursion mentioned in section ?.
  1274.  
  1275. 
  1276.